package com.tsd.config;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;

/**
 * @ClassName: QuartzConfig
 * @Description: CronExpression 常用示例:
 * 0/5 * * * * ? 每5秒检查一次
 * 0 0/1 * * * ? 每分钟检查一次
 * 0 0 12 * * ? 每天12点触发
 * 0 15 10 ? * * 每天10点15分触发
 * 0 15 10 * * ? 每天10点15分触发
 * 0 15 10 * * ? * 每天10点15分触发
 * 0 15 10 * * ? 2005 2005年每天10点15分触发
 * 0 * 14 * * ? 每天下午的 2点到2点59分每分触发
 * 0 0/5 14 * * ? 每天下午的 2点到2点59分(整点开始，每隔5分触发)
 * 0 0/5 14,18 * * ? 每天下午的 2点到2点59分(整点开始，每隔5分触发)
 * 每天下午的 18点到18点59分(整点开始，每隔5分触发)
 * <p>
 * 0 0-5 14 * * ? 每天下午的 2点到2点05分每分触发
 * 0 10,44 14 ? 3 WED     3月分每周三下午的 2点10分和2点44分触发 （特殊情况，在一个时间设置里，执行两次或                                                             两次以上的情况）
 * 0 59 2 ? * FRI    每周5凌晨2点59分触发；
 * 0 15 10 ? * MON-FRI 从周一到周五每天上午的10点15分触发
 * 0 15 10 15 * ? 每月15号上午10点15分触发
 * 0 15 10 L * ? 每月最后一天的10点15分触发
 * 0 15 10 ? * 6L 每月最后一周的星期五的10点15分触发
 * 0 15 10 ? * 6L 2002-2005 从2002年到2005年每月最后一周的星期五的10点15分触发
 * 0 15 10 ? * 6#3 每月的第三周的星期五开始触发
 * 0 0 12 1/5 * ? 每月的第一个中午开始每隔5天触发一次
 * 0 11 11 11 11 ? 每年的11月11号 11点11分触发(光棍节)
 * @Author: Luoyc
 * @Date: 2020/4/23 11:14
 * @Version: 1.0
 */
@Configuration
public class QuartzConfig implements BeanFactoryAware {

    private static final Logger LOGGER = LoggerFactory.getLogger("quartzLogger");

    private BeanFactory beanFactory;

    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        this.beanFactory = beanFactory;
    }

    @Bean
    public SchedulerFactoryBean quartzSchedulerFactoryBean() {
        SchedulerFactoryBean factoryBean = new SchedulerFactoryBean();
        // 覆盖已存在的任务
        factoryBean.setOverwriteExistingJobs(true);
        // 延时启动定时任务，避免系统未完全启动却开始执行定时任务的情况
//        factoryBean.setStartupDelay(15);

//        factoryBean.setTriggers(
//				startCalculateQuartzCronTriggerAfterServerStartUp().getObject(),
//        		clearTempCronTrigger().getObject(),
//		);
        return factoryBean;
    }

//	@Bean(name = "clearTempCronTrigger")
//	public CronTriggerFactoryBean clearTempCronTrigger() {
//		CronTriggerFactoryBean trigger = new CronTriggerFactoryBean();
//		try {
//			trigger.setJobDetail(Objects.requireNonNull(clearTempJobDetail().getObject()));
//			trigger.setCronExpression("0 0 1 * * ?");
//		} catch (Exception e) {
//			e.printStackTrace();
//		}
//		return trigger;
//	}
//
//	@Bean(name = "clearTempJobDetail")
//	public MethodInvokingJobDetailFactoryBean clearTempJobDetail() {
//		MethodInvokingJobDetailFactoryBean factoryBean = new MethodInvokingJobDetailFactoryBean();
//		factoryBean.setTargetObject(quartzJob);
//		factoryBean.setTargetMethod("clearTemp");
//		return factoryBean;
//	}

//
//	@Bean(name = "startCalculateQuartzCronTriggerAfterServerStartUp")
//	public SimpleTriggerFactoryBean startCalculateQuartzCronTriggerAfterServerStartUp() {
//		SimpleTriggerFactoryBean trigger = new SimpleTriggerFactoryBean();
//		try {
//			trigger.setJobDetail(Objects.requireNonNull(startCalculateJobDetail().getObject()));
//			trigger.setStartDelay(5 * 1000L);
//			trigger.setRepeatInterval(0L);
//			trigger.setRepeatCount(0);
//		} catch (Exception e) {
//			e.printStackTrace();
//		}
//		return trigger;
//	}
//
//	@Bean(name = "startCalculateJobDetail")
//	public MethodInvokingJobDetailFactoryBean startCalculateJobDetail() {
//		MethodInvokingJobDetailFactoryBean factoryBean = new MethodInvokingJobDetailFactoryBean();
//		factoryBean.setTargetObject(assetsFeeCalQuartzJob);
//		factoryBean.setTargetMethod("startCalculateAfterServerStartUp");
//		return factoryBean;
//	}
}
